import java.util.ArrayList;
import java.util.stream.Stream;

/*
    stream流常见中间操作方法 :
        Stream <T> limit (long maxsize) : 返回此流中的元素组成的流，截取前指定参数个数的数据
        Stream <T> skip (long n) : 跳过指定参数个数的数据，返回由该流的剩余元素组成的流
        static <T> Stream (T) concat (Stream a , Stream b) : 合并a和b两个流为一个流
        Stream <T> distinct () : 返回由该流的不同元素 ( 根据Object.equals(Object) )组成的流 (去重)
        Stream <T> sorted () : 返回此流的元素组成的流，根据自然顺序排序
        Stream <T> sorted (Comparator comp) : 返回此流的元素组成的流，根据提供的比较器进行排序

    stream流常见终结操作方法 :
        void forEach (Consumer action) : 对此流的每个元素执行操作
           Consumer接口中的方法 void accept ( T t ) : 对给定的参数执行操作
           long count () : 返回此流中的元素数

 */
public class StreamDemo3 {
    public static void main(String[] args) {
        ArrayList<String> alt = new ArrayList<>();
        alt.add("Jack");
        alt.add("Mary");
        alt.add("Tom");
        alt.add("Tony");
        alt.add("Linda");
        alt.add("John");

        //1.取前3个数据在控制台输出
            alt.stream().limit(3).forEach(s->System.out.print(s + " "));
            System.out.println();

        //2.跳过3个元素，把剩下的元素在控制台输出
            alt.stream().skip(3).forEach(s->System.out.print(s + " "));
            System.out.println();

        //3.跳过2个元素，把剩下的元素中前2个元素在控制台输出
            alt.stream().skip(2).limit(2).forEach(s->System.out.print(s + " "));
            System.out.println();

        //4.取前4个数据组成一个流
        Stream<String> limit = alt.stream().limit(4);

        //5.跳过2个数据组成一个流
        Stream<String> skip = alt.stream().skip(2);

        //6.合并 4 和 5 得到的流，并把结果在控制台输出
        //Stream.concat(limit,skip).forEach(s->System.out.print(s + " "));
        //System.out.println();

        //7.合并 4 和 5 得到的流，并把结果在控制台输出，要求字符串元素不能重复
        Stream.concat(limit,skip).distinct().forEach(s->System.out.print(s + " "));
        System.out.println();

        //8.按照字母顺序把数据在控制台输出
        //alt.stream().sorted().forEach(s-> System.out.print(s + " "));
        //System.out.println();

        //9.按照字符串长度把数据在控制台输出(长度相同时按字典序)
        alt.stream().sorted((s1,s2)->{
            int num1 = s1.length() - s2.length();
            int num2 = num1 == 0 ? s1.compareTo(s2) : num1;  //首先按字符串长度进行排序，长度相同时按字典序
            return num2;
        }).forEach(s->System.out.print(s + " "));
        System.out.println();

        //10.统计集合中有几个以"TO-"开头的元素，并把统计结果在控制台输出
        System.out.println(alt.stream().filter(s->s.startsWith("To")).count());

    }
}
